# cmake -S .. -B . -G "MinGW Makefiles" -DCMAKE_TOOLCHAIN_FILE=D:/projectC++/lib/vcpkg-master/scripts/buildsystems/vcpkg.cmake
cmake_minimum_required(VERSION 3.20)  # 推荐版本，支持最新 vcpkg 集成
project(network_module LANGUAGES CXX)

# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# 配置Windows特定设置
if(WIN32)
    # 确保生成Windows风格的.lib文件
    set(CMAKE_STATIC_LIBRARY_PREFIX "") # 移除Unix风格的lib前缀
    set(CMAKE_STATIC_LIBRARY_SUFFIX ".lib")
    
    # 定义_WIN32_WINNT以启用较新的Windows API
    add_definitions(-D_WIN32_WINNT=0x0601) # 对应Windows 7及以上版本
endif()

# 查找依赖库（使用 CONFIG 模式）
find_package(Boost 1.88 REQUIRED CONFIG COMPONENTS asio)
find_package(Protobuf 29.3.0 REQUIRED CONFIG)

# 打印 Protobuf 版本和导入目标信息
message(STATUS "Protobuf_VERSION: ${Protobuf_VERSION}")
message(STATUS "Protobuf_LIBRARIES: ${Protobuf_LIBRARIES}")
message(STATUS "Protobuf_INCLUDE_DIRS: ${Protobuf_INCLUDE_DIRS}")

# 检查 libprotobuf 目标是否存在
if(TARGET protobuf::libprotobuf)
    message(STATUS "Found protobuf::libprotobuf target")
else()
    message(FATAL_ERROR "protobuf::libprotobuf target not found")
endif()

# 显式列出源文件（避免使用 GLOB）
set(SOURCES
    connection.cpp
    connection_manager.cpp
    message_processor.cpp
    protocol_parser.cpp
    server.cpp
)

# 添加库目标
add_library(network_module STATIC ${SOURCES})

# 设置包含目录（现代方式）
target_include_directories(network_module
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
        $<INSTALL_INTERFACE:include>
        ${Protobuf_INCLUDE_DIRS}  # 添加 Protobuf 包含目录
)

# 链接依赖库（使用导入目标）
target_link_libraries(network_module
    PRIVATE
        Boost::asio
        protobuf::libprotobuf
        ws2_32  # 链接 Windows 套接字库
        mswsock # 链接 Windows 套接字扩展库
)

# 设置编译选项
if(MSVC)
    target_compile_options(network_module PRIVATE /W4 /permissive-)
else()
    target_compile_options(network_module PRIVATE -Wall -Wextra -pedantic)
endif()

# 设置安装路径 主目录下的lib下
set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/../")

# 安装静态库
install(TARGETS network_module
    ARCHIVE DESTINATION lib  # 静态库(.lib/.a)安装到lib目录
    LIBRARY DESTINATION lib  # 共享库(.dll/.so)安装到lib目录
    RUNTIME DESTINATION bin  # 可执行文件安装到bin目录
)
